import { app, BrowserWindow, ipcMain, dialog } from 'electron';
import * as path from 'path';
import { readFileSync, writeFileSync } from 'fs';
import { CsvConverter } from '../utils/csvConverter';
import { ConverterManager } from '../utils/converterManager';

// 保持对窗口对象的全局引用，如果不这么做的话，当JavaScript对象被垃圾回收时，窗口会被自动关闭
let mainWindow: BrowserWindow | null;

function createWindow(): void {
  // 创建浏览器窗口
  mainWindow = new BrowserWindow({
    height: 800,
    width: 1200,
    minWidth: 800,
    minHeight: 600,
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: true,
      preload: path.join(__dirname, 'preload.js'),
    },
    icon: path.join(__dirname, '../../assets/icon.png'),
    titleBarStyle: 'default',
    show: false,
  });

  // 加载应用的index.html文件
  if (process.env.NODE_ENV === 'development') {
    mainWindow.loadFile(path.join(__dirname, '../renderer/index.html'));
    // 打开开发工具
    mainWindow.webContents.openDevTools();
  } else {
    mainWindow.loadFile(path.join(__dirname, '../renderer/index.html'));
  }

  // 当窗口准备就绪时显示
  mainWindow.once('ready-to-show', () => {
    if (mainWindow) {
      mainWindow.show();
    }
  });

  // 当窗口关闭时触发
  mainWindow.on('closed', () => {
    // 取消引用窗口对象，如果你的应用支持多窗口的话，通常会把多个窗口对象存放在一个数组里面，
    // 但这次不是，所以当窗口关闭时，应该删除相应的元素。
    mainWindow = null;
  });
}

// Electron会在初始化后并准备创建浏览器窗口时，调用这个函数。
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(createWindow);

// 当全部窗口关闭时退出
app.on('window-all-closed', () => {
  // 在 macOS 上，除非用户用 Cmd + Q 确定地退出，否则绝大部分应用及其菜单栏会保持激活。
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  // 在macOS上，当单击dock图标并且没有其他窗口打开时，通常在应用程序中重新创建一个窗口。
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});

// IPC通信处理
ipcMain.handle('open-file-dialog', async () => {
  if (!mainWindow) {
    return { success: false, error: '主窗口未初始化' };
  }
  
  const result = await dialog.showOpenDialog(mainWindow, {
    properties: ['openFile'],
    filters: [
      { name: 'CSV Files', extensions: ['csv'] },
      { name: 'All Files', extensions: ['*'] }
    ]
  });

  if (!result.canceled && result.filePaths.length > 0) {
    const filePath = result.filePaths[0];
    try {
      const fileContent = readFileSync(filePath, 'utf-8');
      return { success: true, content: fileContent, path: filePath };
    } catch (error) {
      return { success: false, error: error instanceof Error ? error.message : '读取文件失败' };
    }
  }
  return { success: false, error: 'No file selected' };
});

ipcMain.handle('save-file-dialog', async (event, resultData: any, defaultFileName: string) => {
  if (!mainWindow) {
    return { success: false, error: '主窗口未初始化' };
  }
  
  const result = await dialog.showSaveDialog(mainWindow, {
    defaultPath: defaultFileName,
    filters: [
      { name: 'Excel Files', extensions: ['xlsx'] },
      { name: 'All Files', extensions: ['*'] }
    ]
  });

  if (!result.canceled && result.filePath) {
    try {
      // 处理转换结果对象，提取Buffer数据
      let buffer: Buffer;
      if (resultData && resultData.data instanceof Buffer) {
        // 直接接收Buffer
        buffer = resultData.data;
      } else if (resultData && resultData.data && typeof resultData.data === 'object') {
        // 从转换结果对象中提取data字段
        buffer = Buffer.from(resultData.data);
      } else {
        // 原始ArrayBuffer数据
        buffer = Buffer.from(resultData);
      }
      writeFileSync(result.filePath, buffer);
      return { success: true, path: result.filePath };
    } catch (error) {
      return { success: false, error: error instanceof Error ? error.message : '保存文件失败' };
    }
  }
  return { success: false, error: 'Save dialog cancelled' };
});

// 处理CSV转换请求
ipcMain.handle('convert-csv-to-xlsx', async (event, csvData: string, options: any) => {
  try {
    // 使用转换器管理器进行转换
    const result = await ConverterManager.convert('csv-to-xlsx', csvData, options);
    
    if (result.success) {
      return { 
        success: true, 
        data: result.data,
        message: '转换成功'
      };
    } else {
      return { success: false, error: result.error };
    }
  } catch (error) {
    return { success: false, error: error instanceof Error ? error.message : '转换过程中发生未知错误' };
  }
});

// 获取支持的转换器列表
ipcMain.handle('get-converters', async () => {
  const converters = ConverterManager.getAllConverters();
  return converters.map(converter => ({
    name: converter.name,
    supportedFormats: converter.supportedFormats
  }));
});

// 检查格式支持
ipcMain.handle('check-format-support', async (event, format: string) => {
  const supported = ConverterManager.getConvertersForFormat(format);
  return {
    supported: supported.length > 0,
    converters: supported.map(c => c.name)
  };
});

// 获取CSV预览数据
ipcMain.handle('get-csv-preview', async (event, csvData: string, options: any) => {
  try {
    const previewData = CsvConverter.getPreview(csvData, options);
    return { success: true, data: previewData };
  } catch (error) {
    return { success: false, error: error instanceof Error ? error.message : '预览数据获取失败' };
  }
});

// 检测文件编码
ipcMain.handle('detect-file-encoding', async (event, buffer: Buffer) => {
  try {
    const encoding = CsvConverter.detectEncoding(buffer);
    return { success: true, encoding };
  } catch (error) {
    return { success: false, error: error instanceof Error ? error.message : '编码检测失败' };
  }
});